home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / util / boot / ShellUpdate.lha / Documentation / New Features < prev    next >
Text File  |  2002-01-06  |  15KB  |  429 lines

  1.  
  2.         AmigaOs Version 45 new features:
  3.  
  4. The BB2 contributes a new AmigaOs shell segment, extending the
  5. features of the new console driver of Os 3.9. Amongst various
  6. bug fixes of the V40 shell segment, quite some new features have 
  7. been added.
  8.  
  9. ______________________________________________________________________________
  10.  
  11. It can now be tested whether a certain variable has been set; the
  12. shell introduces for that the $? token which returns 1 if the variable
  13. has been defined, and 0 otherwise. Hence,
  14.  
  15. echo $?a
  16.  
  17. prints 0 unless a has been "set" before. The related token $?? tests
  18. whether a variable has been defined as a global variable.
  19.  
  20.  
  21. Some shell commands have been extended, others have been added. Please
  22. check the documentation in this drawer for more information about the
  23. new and improved shell commands.
  24.  
  25. Variable names: The concept of variable names used to be quite broken
  26. in pre 45.5. Release 45.5 introduces a strict and consistent parsing
  27. of variables that should be hopefully backwards compatible without
  28. causing (too many) inconsistencies. A variable name is either:
  29.  
  30. A dollar sign, followed by a sequence of alpha-numeric characters.
  31. A character is alpha-numeric if it is either a digit ('0'-'9'), a
  32. letter ('A'-'Z' or 'a'-'z') or a national character (codes 0xa0 and
  33. above).
  34.  
  35. -or-
  36.  
  37. A dollar sign, followed by a character sequence enclosed in braces.
  38. The name of the variable is the string within the braces without
  39. the braces itself, i.e. $a and ${a} refer to the same variable.
  40.  
  41. A dollar sign may be escaped by a single star, no matter whether
  42. it appears inside or outside of quotes. Note that this is different
  43. from escaping of " and * itself which is required only within
  44. quotes. 
  45.  
  46. Therefore, the following strings represent variables:
  47.  
  48. $a
  49. $9äöü
  50. ${a}        (note that this equals $a)
  51. ${ a }
  52. ${ >a}
  53. ${*a}
  54. ${a;comment}    (this is the variable of the admittedly strange name
  55.          "a;comment", ; does *not* act as a comment introducer
  56.          within braces.
  57. "**$a"        The name of the variable, preceeded by a * sign. The
  58.         * in front of the second star escapes its function as
  59.         $ escape character.
  60.  
  61. The old shell choked on the last examples "successfully".
  62.  
  63. The following sequences are NOT variable names
  64.  
  65. *$a        The string $a instead
  66. "*$a"        The string *$a. The * escapes the $.
  67.  
  68.  
  69. Since backticks are always expanded first regardless of the remaining
  70. shell syntax, you may need to escape them by asterisks, even within
  71. braces. Hence,
  72.  
  73. ${`echo hi`}    refers to the variable "hi"
  74. ${*`echo hi*`}    addesses the undoubtfully strange variable named
  75.         "`echo hi`". Note that here backticks are part
  76.         of the variable name. To set this variable, you
  77.         would have to use:
  78.         set "*`echo hi*`" foo
  79.  
  80. --
  81. New for 45.3: The interpreter name of the "magic interpreter cookie 
  82. #! and ;!" in script files requires now quoting should it contain
  83. spaces. See below.
  84. --
  85.  
  86.  
  87. Commands in double quotes are no longer searched in the resident list,
  88. neither from the alias list. Hence, 
  89.  
  90. 1> "Assign"
  91.  
  92. really means "C:Assign" or any other Assign program from the PATH, but
  93. not a resident version of Assign. Therefore,
  94.  
  95. 1> "CD" RAM:
  96.  
  97. will fail because no external version of "CD" can be found.
  98.  
  99.  
  100. Command line parsing has been reworked a lot. The shell uses now the
  101. following mechanim:
  102.  
  103. 1) Expand all backtick sequences in a first step. Note that this
  104. implies that a possibly backtick'd command gets expanded as its
  105. first step.
  106. 2) Get the first argument, possibly quoted, containing spaces.
  107. 3) If not quoted, check for aliases. If it is an alias, expand
  108. the alias by moving the remaining arguments at the position of
  109. the [] sequence, or at the end of the alias text. If this happens,
  110. steps 1)..3) are repeated, possibly expanding backticks of the
  111. alias.
  112. 4) Expand variables.
  113. 5) Check for implicit commands: CD,RX,EXECUTE,#!-Scripts,
  114. $VIEWER for datatypes. If so, move the command in front of
  115. the arguments.
  116.  
  117. I better don't describe the pre-V45.1 method....
  118.  
  119. Note that the above allows backticks as command sequences
  120. and (canonical usage of) backticks in aliases, unlike pre-V45:
  121.  
  122. 1.SYS:> `echo "List"`
  123.  
  124. will generate a directory listing.
  125.  
  126.  
  127. It also allows recursive aliasing:
  128.  
  129. 7.SCSI:> alias hi ho
  130. 7.SCSI:> alias ho echo "HoHo!"
  131. 7.SCSI:> alias
  132. hi                ho
  133. ho                echo "HoHo!"
  134. 7.SCSI:> ho
  135. HoHo!
  136. 7.SCSI:> hi
  137. HoHo!
  138. 7.SCSI:> 
  139.  
  140. As a special anti-hack, an alias is at most used *once* in an
  141. expansion. That is,
  142.  
  143. 7.SCSI:> alias gnu "gnu is not unix"
  144. 7.SCSI:> alias
  145. gnu               gnu is not unix
  146. 7.SCSI:> gnu
  147. gnu: Unknown command
  148. 7.SCSI:> 
  149.  
  150. will not try to expand "gnu" (again, it is expanded once), as 
  151. you see.
  152.  
  153.  
  154. Backticks and aliases mix now nicely. Note that you need to
  155. escape backticks by * in the alias declaration to avoid that
  156. they get expanded on the alias line immediately:
  157.  
  158. 7.SCSI:> alias ver version "*`which []*`"
  159. 7.SCSI:> alias
  160. ver               version "`which []`"
  161. 7.SCSI:> ver list
  162. list 43.4
  163. 7.SCSI:> 
  164.  
  165.  
  166. Besides various code improvements of the resident commands,
  167. "setenv" got a new option (thanks, Stephan!), so did unsetenv
  168.  
  169. setenv foo SAVE hi
  170.  
  171. will also place the contents of the "foo" variable into ENVARC:,
  172. making it reset-resident.
  173.  
  174. Furthermore, "path" was improved by the "Head" option which moves
  175. new directory components to the front of the list.
  176.  
  177. New directory commands PushCD, PopCD and SwapCD have been added,
  178. study their documentation for details.
  179.  
  180. For other code modifications, study the history file.
  181.  
  182. --
  183.  
  184. Shell V45 re-introduces the handling of the "h" bit. Should it
  185. find a command with "pure" and "h" bits set, it makes the 
  186. command resident automatically. Note that this is (again) the
  187. V39 behaivour. Note that "h" is for "hold", not for "hidden".
  188. The idea of this feature is that some commands can be made
  189. resident automatically within the startup sequence just by using
  190. them. Note that you cannot yet boot from the new shell.
  191.  
  192. The shell does no longer limit command lines to 512 characters.
  193. Command lines can now be unlimited in size, provided the
  194. command itself is smaller than the AmigaOs file name size
  195. limit (107 characters). The Shell will now auto-expand all of 
  196. its internal buffers if required to do so. Furthermore, it
  197. uses now memory pools for this kind of administration.
  198.  
  199. Similar limits to the length of shell variables have been
  200. dropped as well.
  201.  
  202. The shell offers now extended "script" support. In case a script
  203. file - i.e. a file whose "s" and "e" bits are set - starts with
  204. either the magic characters "#!" or ";!", the string following this
  205. magic cookie is understood as the path to a command parser that
  206. shall execute this script. Hence, what we have here is more or
  207. less Un*xoid command interpreter logic. Note that ";!" was chosen
  208. as additional introducer because the Amiga shell uses ";" as 
  209. comment, not "#". If no "#!" or ";!" is found, the script is
  210. parsed as usual by "Execute", as if these scripts would start 
  211. with
  212.  
  213. ;! EXECUTE
  214.  
  215. at the top. Should the path of the command interpreter contain
  216. any spaces, it should be escaped by quotes.
  217.  
  218. Added support for "file browsing". To be able to use this, set
  219. the variable "VIEWER" to the path of a program that is able to
  220. display registered DataTypes. For example, the following line in 
  221. S:Shell-Startup will do this for you:
  222.  
  223. set VIEWER MultiView
  224.  
  225. If the shell encounters now a file as first argument that has
  226. its "e" bit cleared (!) and is parsed and recognized as a data-
  227. type by the data types system, the viewer command is run.
  228.  
  229. NOTE: It is important that "e" is cleared. Otherwise, the shell
  230. tries to load the file as an executable and not as a 
  231. "displayable" file. Most Amiga editors do *not* clear "e" when 
  232. saving text files, unfortuntately. Hence, if this feature seems
  233. to fail, you should check the proper flags setting first.
  234.  
  235.  
  236. Added support for "stderr" redirection. For this purpose, the V45 
  237. shell introduces three new redirection symbols:
  238.  
  239. *>  filename    : redirects stderr to a file
  240. *>> filename    : appends output to stderr to a file
  241. *><         : redirects stderr to the same file that stdout
  242.           goes into.
  243.  
  244. The *> syntax was chosen because "*>" redirects the console
  245. whose file name is "*" for traditional reasons.
  246.  
  247. Note that there are currently few programs that make really use
  248. of the "pr_CES" standard error stream. The shell will also
  249. assign the console to the stderr stream should this be inter-
  250. active. This does not work for plain files, unfortunately.
  251.  
  252. Furthermore, if a file is run "in background" using the "&" 
  253. syntax described below, the stderr defaults to the stdout if
  254. not redirected explicitly. If stderr is not a console, the
  255. console task of the new shell job is set to NULL disallowing
  256. console output.
  257.  
  258.  
  259. Added support for "script stdin" support similar to most Un*x
  260. shells. If the shell finds a "<<" redirection, the following
  261. symbol of the script is understood as an "end marker" symbol.
  262. All following lines up to a line starting with the "end" 
  263. marker are then literally pushed into the command as "stdin" 
  264. stream.
  265.  
  266. Hence, the following example will display "Hello World!" by
  267. the "more" pager:
  268.  
  269. more << End    ;means: provide all the following lines as stdin
  270. Hello World!
  271. End        ;stop scanning here.
  272.  
  273. Unfortunately, the "<<" syntax does not mix with "run" for 
  274. some internal reasons that are beyond the control of the shell. 
  275. However, it mixes fine with the "&" syntax below.
  276.  
  277.  
  278. Added a new command line token, the "&" character. This is 
  279. more or less an "implicit run". Hence, a command line ending 
  280. on "&" will run the command. If the command generates output, 
  281. the result depends very much on the console you're using. For 
  282. CON: and others, the output is mixed with ordinary console 
  283. output very much like "run" did before. For ViNCEd, the 
  284. background command is halted as soon as it attempts "to mess 
  285. the console". Furthermore, the shell prints the shell number 
  286. of the background command before it is executed, so you know 
  287. the CLI number. The following shows a typical output generated 
  288. by this feature:
  289.  
  290. 9.SCSI:> list &
  291. [CLI 6] : list
  292. 9.SCSI:> 
  293. "list" suspended. [ViNCEd output]
  294. 9.SCSI:> 
  295.  
  296. This indicates that we are currently in shell #9 (see the 
  297. prompt), and "list" is in shell #6 (see the first line below 
  298. the line with the "&"). List got suspended because its output 
  299. would otherwise interfere with console output. We may resume 
  300. "list" by bringing it back into "foreground" by the "fg"
  301. script of ViNCEd. Hence:
  302.  
  303. 9.SCSI:> fg 6
  304. Trashcan                           Dir ----rwed Today     00:09:24
  305. Trashcan.info                     1172 ---arw-d 31-Oct-99 20:46:15
  306. ....
  307.  
  308. resumes the listing. This pretty much introduces Un*xoid j
  309. ob handling on the Amiga console. To run a command in back-
  310. ground, you may use the following syntax:
  311.  
  312. 9.SCSI:> list <>NIL: &
  313. [CLI 6] : list
  314. 9.SCSI:>
  315.  
  316. which is admittedly not a very useful example, but I guess 
  317. you got the idea.
  318.  
  319.  
  320. Added automatic stack size setup for shell commands. This 
  321. is a new feature that will hopefully limit the number of
  322. stack underflows as it allows application developers to 
  323. increase the stack automatically without the need for stack 
  324. swap code. The shell scans now the first 1K of each segment
  325. of a loaded binary for the magic cookie
  326.  
  327. $STACK:
  328.  
  329. The string behind this cookie should be a decimal number,
  330. terminated with a line feed (and an ASCII NUL, i.e. '\0',
  331. as for all C strings). This number is then interpreted as
  332. the stack size in bytes. The shell will automatically in-
  333. crease the stack size *for this command only*. If the pre-
  334. defined stack size is larger than the program-implicit,
  335. nothing will happen.
  336.  
  337. Example: Add the following new module "stack.c" to your
  338. program. Ensure that this module is linked to the beginning 
  339. of the executable:
  340.  
  341. /** Automatic stack extension cookie follows here.
  342.  ** this cookie must be placed !at the beginning! or
  343.  ** at least within the first 1K of data of the code
  344.  ** or string section. Shell will look for it there
  345.  ** and will guarantee that the stack size is at least
  346.  ** as large as specified.
  347.  **/
  348.  
  349. char stackcookie[] = "$STACK:10240\n"; /* gimme 10K of stack! */
  350.  
  351.  
  352. Old, but leser-known features:
  353.  
  354. Arexx support: If a file has its s-bit and e-bits set and 
  355. starts with the magic characters "/*", then it is assumed 
  356. to be a Rexx script and executed thru Arexx. 
  357.  
  358. Pipe-Support: If you define either the variable "_pchar" 
  359. or "_mchar" to a one, or two character sequence, then the 
  360. shell will forward lines containing these characters to a 
  361. command named "PIPE" that will handle or rather emulate
  362. piping. Various pipe commands can be found on the net. 
  363. For example, add the following lines to your S:Shell-Startup
  364.  
  365. Set _pchar "|"
  366. Set _mchar "||"
  367.  
  368. and install your favourite pipe into "C:". I further 
  369. recommend to make this pipe command resident. Then the 
  370. following line will pipe the output of "list" thru "more":
  371.  
  372. 9.SCSI:> list | more
  373.  
  374. ______________________________________________________________________________
  375.  
  376.  
  377. Bug fixes:
  378.  
  379. Oh wow, this was a tough job. The Shell really looked like
  380. some kind of BCPL left-over. It took several days just to
  381. cleanup the code and turn it into something more readable.
  382. BCPL was lurking thru the code all over. No more, folks,
  383. no more...
  384.  
  385. The V40 shell was unable to perform the "implicit CD" command
  386. properly if the directory name was quoted. It inserted an
  387. unnecessary blank space behind the directory name.
  388.  
  389. The shell didn't support multiple backticks on the command line;
  390. the command line parser was simply broken.
  391.  
  392. Fixed handling of asterisk-backtick sequences. The backtick
  393. wasn't escaped properly.
  394.  
  395. The shell did not treat TABs as blank spaces. Fixed.
  396.  
  397. Removed the SetClock cludge. Whoever is still using a 1.3
  398. SetClock nowadays cannot be helped anymore and deserved
  399. to be crashed. (-;
  400.  
  401. Added a few missing Forbid/Permit locks around access of
  402. the list of resident commands.
  403.  
  404. Removed an ugly hack to set the RC and Result2 variables;
  405. this really uses now the proper system functions and doesn't
  406. attempt to hack directly into the variable buffers.
  407.  
  408. Reworked the parser a lot; it partially tried to fiddle in
  409. the internal buffers of file handles using structures that
  410. have never been documented. The code now loads full lines
  411. at once (no matter how big they are) and then parses within
  412. its buffers. This removes all dependencies of implementation
  413. details of the file handles.
  414.  
  415. Arguments to redirection did not expand backticks. Fixed.
  416.  
  417. Added a lot of proper error checking if it is low on memory.
  418.  
  419. The internal (and deceased "GlobalVector") is no longer
  420. passed thru to all functions. Instead, I'm now using some
  421. SAS magic to allocate my data segment myself on each
  422. invocaton.
  423.  
  424. Decided not to disable echo-ing for non-interactive shells.
  425. Otherwise, we could not debug scripts or the startup-sequence.
  426. Sorry, Heinz, but I reconsidered and it's really better this
  427. way.
  428.